package uniriotec.dsw.tickets.modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Enumerated;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;

import org.hibernate.annotations.DiscriminatorFormula;
import org.hibernate.validator.NotNull;




//@Entity
//@Inheritance(strategy = InheritanceType.JOINED)
//@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
//@DiscriminatorColumn(name="perfil",discriminatorType=DiscriminatorType.STRING)
//@DiscriminatorValue(value="ROLE_USUARIO")

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
//@DiscriminatorColumn(name = "perfil", length = 1, discriminatorType = DiscriminatorType.STRING)
//@DiscriminatorFormula( "(select p.perfil from development.perfil p, development.usuario u where u.perfil_id=p.id)" )
@DiscriminatorFormula( "(case when perfil is null then 'ROLE_USUARIO' else perfil end)" )


//@DiscriminatorValue("ROLE_USUARIO")
public abstract class Usuario implements Serializable {
 
   
    
    

//public class Usuario {

   	
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5812298801591674958L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
	
	@NotNull
    @Column(length = 60)
    private String nome;
    
	@NotNull
    @Column(length = 60)
    private String sobrenome;
    
	@NotNull
    @Column(length = 60,unique=true)
    private String email;
    
	@NotNull
    @Column(length = 8)
    private String senha;
    
    /*@OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "usuario_id")
    private List<Acesso> acessos = new ArrayList<Acesso>();*/
    
/*	@Column(insertable=false, updatable=false)
    //@Enumerated(javax.persistence.EnumType.STRING)
    private String perfil;*/
    
    
	//@Column(insertable=false, updatable=false)
	@NotNull
    @Column(length = 30)
	@Enumerated(javax.persistence.EnumType.STRING)
    private Perfil perfil;
	
	/*@ManyToOne(cascade=CascadeType.PERSIST)
	private Perfil perfil;*/
	
	
    
    private boolean ativo;

    
    public Usuario() {}
		//super();
		//this.perfil=TipoPerfil.ROLE_USUARIO;
		//this.setAtivo(true);
		//this.setAcessos(null);
		// TODO Auto-generated constructor stub
	//}

	public Usuario(String nome, String sobrenome, String email, String senha,/*List<Acesso> acessos,*/ boolean ativo) {
		super();
		this.nome = nome;
		this.sobrenome = sobrenome;
		this.email = email;
		this.senha = senha;
		//this.acessos = acessos;
		this.ativo = ativo;
		
		//this.setPerfil(TipoPerfil.ROLE_USUARIO.toString());
	}

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

  /*  public List<Acesso> getAcessos() {
        return acessos;
    }

    public void setAcessos(List<Acesso> acessos) {
        this.acessos = acessos;
    }*/

    public boolean isNovo() {
        if (id == null || id ==0) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Usuario other = (Usuario) obj;
        if (id == null) {
            if (other.id != null) {
                return false;
            }
        } else if (!id.equals(other.id)) {
            return false;
        }
        return true;
    }

    @Override
	public String toString() {
		return nome;
	}



	public boolean isAtivo() {
		return ativo;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	/*public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}*/

/*	public String getPerfil() {
		return perfil;
	}

	public void setPerfil(String perfil) {
		this.perfil = perfil;
	}*/

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}


}